/**
 * 数字转人民币大写
 * @param num
 */
export function numToRMB(num: number): string {
    const chineseNums = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']
    const chineseUnits = ['', '拾', '佰', '仟']
    const chineseBigUnits = ['', '万', '亿'] // 更大的数可以继续在这个数组中添加
    if (typeof num !== 'number' || isNaN(num) || !isFinite(num)) {
        throw new Error('输入必须是数字')
    }
    if (num < 0) {
        throw new Error('输入必须是正数')
    }
    //判断是否是小数且小数位数是否超过2位
    let strNum = num.toString().split('.')[0]
    let decimalNum = num.toString().split('.')[1]
    if (decimalNum?.length > 2) {
        throw new Error('小数位数不能超过2位')
    }
    if (decimalNum && Number(decimalNum) == 0) {
        decimalNum = ''
    }
    // 将数字转为字符串，便于逐位处理
    strNum = strNum
        .split('')
        .map((str, i) => {
            const n = Number(str)
            let char = chineseNums[n]
            if (num > 9) {
                //不是0，就要拼单位了，首先要算它是哪一位，比如21的2，下标是0，但要对应unit的的下标1,1下标是1但要对应unit的下标0
                //获得位数
                const unitIndex = strNum.length - 1 - i
                if (n !== 0) {
                    const index = unitIndex % 4
                    char += chineseUnits[index]
                }

                //如果是4位数，还要加上大单位
                if (unitIndex % 4 == 0) {
                    char += chineseBigUnits[unitIndex / 4]
                }
            }

            return char
        })
        .join('')
        .replaceAll(/零+/g, '零')
        .replace('零万', '万')
        .replace('零亿', '亿')
        .replaceAll(/(^零)|(零$)/g, '')
    if (!decimalNum) {
        return strNum + '元整'
    }
    strNum += '元'
    strNum += chineseNums[Number(decimalNum.charAt(0))]
    if (decimalNum.length == 2 && Number(decimalNum.charAt(0)) > 0) {
        strNum += '角'
    }
    if (decimalNum.length == 2 && Number(decimalNum.charAt(1)) > 0) {
        strNum += chineseNums[Number(decimalNum.charAt(1))] + '分'
    }
    return strNum
}

/**
 * 数字转中文，只支持整数
 * @param num
 */
export function numToChinese(num: number): string {
    const chineseNums = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']
    const chineseUnits = ['', '十', '百', '千']
    const chineseBigUnits = ['', '万', '亿'] // 更大的数可以继续在这个数组中添加
    if (typeof num !== 'number' || isNaN(num) || !isFinite(num)) {
        throw new Error('输入必须是数字')
    }
    //判断是否是小数
    const isDecimal = num.toString().indexOf('.') > -1
    if (isDecimal) {
        throw new Error('输入必须是整数')
    }
    if (num === 0) {
        return chineseNums[0]
    }
    //判断是否是负数
    const isNegative = num < 0
    num = Math.abs(num)
    // 将数字转为字符串，便于逐位处理
    let strNum = String(num)
    strNum = strNum
        .split('')
        .map((str, i) => {
            const n = Number(str)
            let char = chineseNums[n]
            if (num > 9) {
                //不是0，就要拼单位了，首先要算它是哪一位，比如21的2，下标是0，但要对应unit的的下标1,1下标是1但要对应unit的下标0
                //获得位数
                const unitIndex = strNum.length - 1 - i
                if (n !== 0) {
                    const index = unitIndex % 4
                    char += chineseUnits[index]
                }

                //如果是4位数，还要加上大单位
                if (unitIndex % 4 == 0) {
                    char += chineseBigUnits[unitIndex / 4]
                }
            }
            return char
        })
        .join('')
        .replaceAll(/零+/g, '零')
        .replace('零万', '万')
        .replace('零亿', '亿')
        .replaceAll(/(^零)|(零$)/g, '')
        .replaceAll(/^一十/g, '十')
    return isNegative ? `负${strNum}` : strNum
}

/**
 * 获取指定整数范围内的随机整数
 * @param end - 结束范围
 * @param start - 开始范围，默认0
 */
export function randomInt(end: number, start = 0): number {
    const range = end - start
    const random = Math.floor(Math.random() * range + start)
    return random
}
